// fileManager.js
const fs = require('fs')

// 创建一个FileManager类
class FileManager {
    filePathCurrent = []      // 储存当前目录下的文件路径
    // 基本html模板页面
    baseHtml = fs.readFileSync('./views/base.html', 'utf-8')
    rootDirName = './public/'
    constructor() {
    }

    // 获得当前文件夹中的文件方法
    readFileCurrent(dir) {
        const pathList = []
        //传入当前文件夹路径
        const files = fs.readdirSync(dir)
        files.forEach(v => {
            const path = dir + v
            //之后打算使用express.static('public')这个内置中间件解决页面分模块夹在public文件夹下的资源问题，所以要把public去掉
            const reg = path.match(/\.\/public\/(.+)/)
            pathList.push(reg[1])
        })
        // filePathCurrent 中保存了当前文件夹去除public后的路径
        this.filePathCurrent = pathList
    }

    // 创建列表的方法
    createUl(pathList, isRoot, upperDir) {
        let li = []
        // 如果不是根目录，添加返回按钮
        if (!isRoot) {
            li += `<li><a href="/">返回首页</a></li>\n`
        }

        pathList.forEach(v => {
            // 判断是文件还是文件夹，if是文件的处理，else是文件夹的处理
            if (v.indexOf('.') !== -1) {
                // 隐藏每个文件夹中的index.html
                v.indexOf('index.html')<0? li += `<li><a href="/${v}">./${v}</a></li>\n` : ''
            } else {
                li += `<li style="display: flex; align-items: center"><span style="width:30px; height: 30px"><img width="30" height="30" src="/images/4.webp"></span><a href="/${v}">${v}</a></li>\n`
            }
        })
        // 如果有上一级目录就添加返回按钮
        if (upperDir) {
            const reg = upperDir.replace(/\.\/public\//, '')

            li += `<li><a href="/${reg}">返回上一页</a></li>\n`
        }
        return `<ul>${li}</ul>`
    }

    // 初始化目录方法
    initDir(dir=this.rootDirName, isRoot, upperDir) {
        // 读取当前文件夹中的文件信息，保存在filePathCurrent中
        this.readFileCurrent(dir)
        // 调用createUl生成ul来替换模版中的{{content}}内容
        const regex = this.baseHtml.replace(/{{content}}/, this.createUl(this.filePathCurrent, isRoot, upperDir))
        // 在每个文件夹目录下新建index.html文件，写入数据
        fs.writeFileSync((dir + 'index.html'), regex)
        this.filePathCurrent.forEach(v => {
            // 如果是文件夹就递归继续调用initDir的方法
            if (v.indexOf('.') === -1) {
                this.initDir(this.rootDirName + v + '/', false, dir)
            }
        })
    }
}

module.exports = FileManager